<?php 
class Alipay{
	
		/*
		*功能：设置帐户有关信息及返回路径（基础配置页面）
		*版本：3.1
		*日期：2010-10-29
		'说明：
		'以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
		'该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
	
	*/
	
	/** 提示：如何获取安全校验码和合作身份者ID
	1.访问支付宝商户服务中心(b.alipay.com)，然后用您的签约支付宝账号登陆.
	2.访问“技术服务”→“下载技术集成文档”（https://b.alipay.com/support/helperApply.htm?action=selfIntegration）
	3.在“自助集成帮助”中，点击“合作者身份(Partner ID)查询”、“安全校验码(Key)查询”
	
	安全校验码查看时，输入支付密码后，页面呈灰色的现象，怎么办？
	解决方法：
	1、检查浏览器配置，不让浏览器做弹框屏蔽设置
	2、更换浏览器或电脑，重新登录查询。
	*/
	
	//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
	//合作身份者ID，以2088开头的16位纯数字
	private $partner		= "";
	
	//安全检验码，以数字和字母组成的32位字符
	private $key   			= "";
	
	//签约支付宝账号或卖家支付宝帐户
	private $seller_email	= "";
	
	//交易过程中服务器通知的页面 要用 http://格式的完整路径，不允许加?id=123这类自定义参数
	private $notify_url		= "http://www.xxx.com/js_php_utf8/notify_url.php";
	
	//付完款后跳转的页面 要用 http://格式的完整路径，不允许加?id=123这类自定义参数
	//return_url的域名不能写成http://localhost/js_php_utf8/return_url.php ，否则会导致return_url执行无效
	private $return_url		= "http://www.xxx.com/js_php_utf8/return_url.php";
	
	//网站商品的展示地址，不允许加?id=123这类自定义参数
	private $show_url		= "http://www.alipay.com";
	
	//收款方名称，如：公司名称、网站名称、收款人姓名等
	private $mainname		= "收款方名称";
	
	//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
	
	
	
	//签名方式 不需修改
	private $sign_type		= "MD5";
	
	//字符编码格式 目前支持 GBK 或 utf-8
	private $_input_charset	= "utf-8";
	
	//访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
	private $transport		= "http";
	
	public function __construct(){
		$payment = M('Payment');
		$data = $payment->find(1);
		$config = C('SYSCONFIG');
		$this->partner = $data['business'];
		$this->key = $data['key'];
		$this->seller_email = $data['mail'];
		$this->notify_url = HOST.__APP__.'/Payment/alipay_notify_url';
		$this->return_url = HOST.__APP__.'/Payment/alipay_return_url';
		$this->show_url = HOST.__APP__;
		$this->mainname = $config['webname'];
	}
	
	public function _notify_url(){
		require_once("payment/alipay/alipay_notify.php");
		$alipay = new alipay_notify($this->partner,$this->key,$this->sign_type,$this->_input_charset,$this->transport);    //构造通知函数信息
		$verify_result = $alipay->notify_verify();  //计算得出通知验证结果
		
		if($verify_result) {//验证成功
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代
			
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
		    //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
//		    $dingdan           = $_POST['out_trade_no'];	//获取支付宝传递过来的订单号
//		    $total             = $_POST['total_fee'];		//获取支付宝传递过来的总价格
		
		    if($_POST['trade_status'] == 'TRADE_FINISHED' ||$_POST['trade_status'] == 'TRADE_SUCCESS') {    //交易成功结束
				//判断该笔订单是否在商户网站中已经做过处理（可参考“集成教程”中“3.4返回数据处理”）
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
		       
				echo "success";		//请不要修改或删除
				return true;
		        //调试用，写文本函数记录程序运行情况是否正常
		        //log_result("这里写入想要调试的代码变量值，或其他运行的结果记录");
		    }
		    else {
		    	
		        echo "success";		//其他状态判断。普通即时到帐中，其他状态不用判断，直接打印success。
				return true;
		        //调试用，写文本函数记录程序运行情况是否正常
		        //log_result ("这里写入想要调试的代码变量值，或其他运行的结果记录");
		    }
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		}
		else {
		    //验证失败
		    echo "fail";
			return false;
		    //调试用，写文本函数记录程序运行情况是否正常
		    //log_result ("这里写入想要调试的代码变量值，或其他运行的结果记录");
		}
	}
	
	public function _return_url(){
		require_once("payment/alipay/alipay_notify.php");		
		//构造通知函数信息
		$alipay = new alipay_notify($this->partner,$this->key,$this->sign_type,$this->_input_charset,$this->transport);
		//计算得出通知验证结果
		$verify_result = $alipay->return_verify();
		
		if($verify_result) {//验证成功
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代码
			
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
		    //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
//		    $dingdan           = $_GET['out_trade_no'];    //获取订单号
//		    $total_fee         = $_GET['total_fee'];	    //获取总价格
		
		    if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
				//判断该笔订单是否在商户网站中已经做过处理（可参考“集成教程”中“3.4返回数据处理”）
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
					return true;
		    }
		    else {
		      return $_GET['trade_status'];
		    }
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		}
		else {
		    //验证失败
		    //如要调试，请看alipay_notify.php页面的return_verify函数，比对sign和mysign的值是否相等，或者检查$veryfy_result有没有返回true
		    //echo "fail";
		    return false;
		}
	}
	
	/*$data 为数组
	 * RE
	 * ['sn']定单号
	 * ['amount'] 订单价格
	 * 
	 * PA
	 * ['ordersn']定单号
	 * ['goodsname']商品名称
	 * ['remark']商品描述
	 * ['orderprice'] 订单价格
	 * 
	 * $type 为订单类型 RE充值 PA支付
	 * */
	public function _alipayto($data,$type='RE'){
		require_once("payment/alipay/alipay_service.php");
		/*以下参数是需要通过下单时的订单数据传入进来获得*/
		//必填参数
		if ($type == 'RE'){
			$config = C('SYSCONFIG');
			$beat = $data['amount'] * $config['rmb_beat'];
			
			$out_trade_no = $data['sn'];		//请与贵网站订单系统中的唯一订单号匹配
			$subject      = $data['sn'];//$config['webname'];	//订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
			$body         = '';//$config['webname'].$beat.$config['beat_name'];	//订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
			$total_fee    = $data['amount'];	//订单总金额，显示在支付宝收银台里的“应付总额”里
		}elseif ($type == 'PA'){
			$out_trade_no = $data['ordersn'];		//请与贵网站订单系统中的唯一订单号匹配
			$subject      = $data['ordersn'];//$data['goodsname'];	//订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
			$body         = '';//$data['remark'];	//订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
			$total_fee    = $data['orderprice'];	//订单总金额，显示在支付宝收银台里的“应付总额”里
		}
		//扩展功能参数——默认支付方式
		$pay_mode	  = 'bankPay';
		if ($pay_mode == "directPay") {
			$paymethod    = "directPay";	//默认支付方式，四个值可选：bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付)
			$defaultbank  = "";
		}
		else {
			$paymethod    = "bankPay";		//默认支付方式，四个值可选：bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付)
			$defaultbank  = $pay_mode;		//默认网银代号，代号列表见http://club.alipay.com/read.php?tid=8681379
		}
		
		
		//扩展功能参数——防钓鱼
		//请慎重选择是否开启防钓鱼功能
		//exter_invoke_ip、anti_phishing_key一旦被使用过，那么它们就会成为必填参数
		//开启防钓鱼功能后，服务器、本机电脑必须支持远程XML解析，请配置好该环境。
		//若要使用防钓鱼功能，请打开class文件夹中alipay_function.php文件，找到该文件最下方的query_timestamp函数，根据注释对该函数进行修改
		//建议使用POST方式请求数据
		$anti_phishing_key  = '';			//防钓鱼时间戳
		$exter_invoke_ip = '';				//获取客户端的IP地址，建议：编写获取客户端IP地址的程序
		//如：
		//$exter_invoke_ip = '202.1.1.1';
		//$anti_phishing_key = query_timestamp($partner);		//获取防钓鱼时间戳函数
		
		//扩展功能参数——其他
		$extra_common_param = '';			//自定义参数，可存放任何内容（除=、&等特殊字符外），不会显示在页面上
		$buyer_email		= '';			//默认买家支付宝账号
		
		//扩展功能参数——分润(若要使用，请按照注释要求的格式赋值)
		$royalty_type		= "";			//提成类型，该值为固定值：10，不需要修改
		$royalty_parameters	= "";
		//提成信息集，与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
		//各分润金额的总和须小于等于total_fee
		//提成信息集格式为：收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2
		//如：
		//royalty_type = "10"
		//royalty_parameters	= "111@126.com^0.01^分润备注一|222@126.com^0.01^分润备注二"
		
		
		/////////////////////////////////////////////////
		
		//构造要请求的参数数组，无需改动
		$parameter = array(
		        "service"			=> "create_direct_pay_by_user",	//接口名称，不需要修改
		        "payment_type"		=> "1",               			//交易类型，不需要修改
		
		        //获取配置文件(alipay_config.php)中的值
		        "partner"			=> $this->partner,
		        "seller_email"		=> $this->seller_email,
		        "return_url"		=> $this->return_url,
		        "notify_url"		=> $this->notify_url,
		        "_input_charset"	=> $this->_input_charset,
		        "show_url"			=> $this->show_url,
		
		        //从订单数据中动态获取到的必填参数
		        "out_trade_no"		=> $out_trade_no,
		        "subject"			=> $subject,
		        "body"				=> $body,
		        "total_fee"			=> $total_fee,
		
		        //扩展功能参数——网银提前
		        "paymethod"			=> $paymethod,
		        "defaultbank"		=> $defaultbank,
		
		        //扩展功能参数——防钓鱼
		        "anti_phishing_key"	=> $anti_phishing_key,
				"exter_invoke_ip"	=> $exter_invoke_ip,
		
				//扩展功能参数——自定义参数
				"buyer_email"		=> $buyer_email,
		        "extra_common_param"=> $extra_common_param,
				
				//扩展功能参数——分润
		        "royalty_type"		=> $royalty_type,
		        "royalty_parameters"=> $royalty_parameters
		);
		
		//构造请求函数
		$alipay = new alipay_service($parameter,$this->key,$this->sign_type);
		$sHtmlText = $alipay->build_form();
		return $sHtmlText;
	}
	
	
	
	
}
?>